package com.librelato.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.librelato.bean.ChamadoBean;
import com.librelato.bean.CompradorBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.ModuloBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.persistencia.config.SQLConfiguracao;
import com.librelato.persistencia.enums.EnumCondicao;
import com.librelato.persistencia.interfaces.IUsuarioDao;

public class UsuarioDao<P extends UsuarioBean> extends DaoGenerico<P> implements
		IUsuarioDao<P> {

	private Connection conn;
	private String query;
	private PreparedStatement ps;
	private ResultSet rs;

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		return null;
	}

	public void excluir(P p) throws Exception {
	};

	public void editar(P p) throws Exception {
	};

	public P salvar(P p) {
		return null;
	}

	public void preSalvar(P p) {
	};

	public P verLogin(final P p) throws Exception {
		ps = null;
		rs = null;
		conn = null;
		query = null;
		p.setNome(null);
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_tipo_usuario");
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getLogin());
			ps.setString(2, p.getSenha());
			rs = ps.executeQuery();
			if (rs.next()) {
				if (rs.getString("SETOR").equals("Fornecedores")) {
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_usuario_forn");
				} else {
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_usuario");
				}
			} else {
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_usuario");
			}

			ps = conn.prepareStatement(query);
			ps.setString(1, p.getLogin());
			ps.setString(2, p.getSenha());
			rs = ps.executeQuery();
			if (rs.next()) {
				p.setCodigo(rs.getLong("IDUSER") + "");
				p.setLogin(rs.getString("LOGIN"));
				p.setNome(rs.getString("NOME"));
				p.setSenha(rs.getString("SENHA"));
				p.setSetor(rs.getString("SETOR"));
				p.setAtivo(rs.getString("ATIVO"));
				p.setTipo(rs.getString("TIPO"));
				p.setTipoChamado(rs.getString("CHAMADO"));
				p.setEmail(rs.getString("EMAIL"));
				p.setCodMicrosiga(rs.getString("USERMICROSIGA"));
//				p.setNivelDeAcessoAta(rs.getInt("NIVELACESSOATA"));
				if (p.getSetor().trim().equals("Fornecedores")) {
					p.setMatricula(rs.getString("A2_COD"));
				} else {
					p.setMatricula(rs.getString("MAT_FUNC"));
					p.setCentroCusto(rs.getString("RA_CC"));
				}
				if (rs.getString("CODCOMP") != null
						&& !"".equals(rs.getString("CODCOMP"))) {
					p.setComprador(new CompradorBean(p.getCodigo(),
							p.getNome(), rs.getString("CODCOMP")));
				}
				p.setFilial(getFilial(rs.getLong("IDUSER")));
				p.setListaEmpresas(getEmpresas(Long.parseLong(p.getCodigo())));
				p.setListaMenus(getMenus(Long.parseLong(p.getCodigo())));
				p.setListaModulos(getModulos(Long.parseLong(p.getCodigo())));
			}
			return p;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	}

	public void trocarSenha(P p, String senhaNova) throws Exception {
		conn = null;
		ps = null;
		query = null;

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("altera_senha");
			ps = conn.prepareStatement(query);
			ps.setString(1, senhaNova.trim());
			ps.setInt(2, Integer.parseInt(p.getCodigo()));
			ps.executeUpdate();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	}

	private EmpresaBean getFilial(final Long idUser) throws Exception {
		conn = null;
		ps = null;
		rs = null;
		query = null;
		EmpresaBean empresa = new EmpresaBean();
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_filial");
			ps = conn.prepareStatement(query);
			ps.setLong(1, idUser);
			rs = ps.executeQuery();
			if (rs.next()) {
				empresa.setFilial(rs.getString("FILIAL"));
				empresa.setDescricao(rs.getString("DESCRICAO"));
				empresa.setCidade(rs.getString("NOME"));
				empresa.setUf(rs.getString("UF"));
				empresa.setEndereco(rs.getString("ENDERECO"));
				empresa.setCnpj(rs.getString("CNPJ"));
			}
			return empresa;

		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}

	}

	private List<EmpresaBean> getEmpresas(final Long idUser) throws Exception {
		conn = null;
		ps = null;
		rs = null;
		query = null;
		List<EmpresaBean> listEmpresas = new ArrayList<EmpresaBean>();
		EmpresaBean empresa;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_empresas");
			ps = conn.prepareStatement(query);
			ps.setLong(1, idUser);
			rs = ps.executeQuery();
			while (rs.next()) {
				empresa = new EmpresaBean();
				empresa.setFilial(rs.getString("FILIAL"));
				empresa.setDescricao(rs.getString("DESCRICAO"));
				empresa.setCidade(rs.getString("NOME"));
				empresa.setUf(rs.getString("UF"));
				empresa.setEndereco(rs.getString("ENDERECO"));
				empresa.setCnpj(rs.getString("CNPJ"));
				listEmpresas.add(empresa);
			}
			return listEmpresas;

		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}
	}

	private List<String> getMenus(final Long idUser) throws Exception {

		conn = null;
		ps = null;
		rs = null;
		query = null;
		List<String> listMenus = new ArrayList<String>();
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_menus");
			ps = conn.prepareStatement(query);
			ps.setLong(1, idUser);
			rs = ps.executeQuery();
			while (rs.next()) {
				listMenus.add(rs.getString("IDMENU"));
			}
			return listMenus;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}
	}

	private List<ModuloBean> getModulos(final Long idUser) throws Exception {

		conn = null;
		ps = null;
		rs = null;
		query = null;
		ModuloBean modulo;
		List<ModuloBean> listModulos = new ArrayList<ModuloBean>();
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_modulos");
			ps = conn.prepareStatement(query);
			ps.setLong(1, idUser);
			rs = ps.executeQuery();
			while (rs.next()) {
				modulo = new ModuloBean();
				modulo.setCodigo(rs.getLong("IDMODULO"));
				modulo.setNome(rs.getString("NOME"));
				listModulos.add(modulo);
			}
			return listModulos;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaResponsaveis(String setor, P p) throws Exception {
		List<UsuarioBean> responsaveis = new ArrayList<UsuarioBean>();
		UsuarioBean usuario = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_responsaveis");
			if (p.getTipo().equals("Gerente")) {
				query += " WHERE SETOR = 'TI'";
				ps = conn.prepareStatement(query);
			} else if (p.getTipo().equals("Coordenador")
					&& (setor.equals("Hardware") || setor.equals("Comunicação"))) {
				query += " WHERE (RTRIM(LTRIM(CHAMADO)) IN ('Hardware','Comunicação','Engenharia') OR TIPO = 'Gerente')";
				ps = conn.prepareStatement(query);
			} else {
				query += " WHERE (RTRIM(LTRIM(CHAMADO)) = ? OR TIPO = 'Gerente')";
				ps = conn.prepareStatement(query);
				ps.setString(1, setor);
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				usuario = new UsuarioBean();
				usuario.setCodigo(rs.getString("IDUSER"));
				usuario.setNome(rs.getString("NOME"));
				responsaveis.add(usuario);
			}
		} catch (Exception e) {
			throw e;
		}

		return (List<P>) responsaveis;
	}

	@Override
	public List<String> buscaEmails(ChamadoBean chamado, String acaoUsuario)
			throws Exception {

		List<String> listaEmail = new ArrayList<String>();
		try {
			conn = GerenciadorConexao.getConexao();
			if ("Inclui".equals(acaoUsuario)) {
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_emails");
				ps = conn.prepareStatement(query);
				ps.setString(1, chamado.getTipoProblema().getDestinoChamado());

			} else {
				query = SQLConfiguracao.getInstance()
						.getValor("localiza_email");
				ps = conn.prepareStatement(query);
				ps.setString(1, chamado.getUsuario().getCodigo());
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				listaEmail.add(rs.getString("EMAIL").trim());
			}
		} catch (Exception e) {
			throw e;
		}

		return listaEmail;
	}

	@SuppressWarnings("unchecked")
	public List<P> buscaSolicitantesAtendidos(Map<String, Object> param)
			throws Exception {

		List<UsuarioBean> solicitantes = new ArrayList<UsuarioBean>();
		UsuarioBean solicitante;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_solicitantes_atendidos");
			if (param.get("DESTINOCHAMADO") != null) {
				query += " AND CHAMADOS.DESTINO IN ('"
						+ param.get("DESTINOCHAMADO") + "')";
			}
			if (param.get("RESPONSAVEL") != null) {
				query += " AND CHAMADOS.RESPONSAVEL = ?";
			}
			ps = conn.prepareStatement(query);
			if (param.get("RESPONSAVEL") != null) {
				ps.setLong(psIndex++, (long) param.get("RESPONSAVEL"));
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				solicitante = new UsuarioBean(rs.getLong("IDUSER") + "",
						rs.getString("NOMEUSU"), null);
				solicitantes.add(solicitante);
			}
		} catch (Exception e) {
			throw e;
		}

		return (List<P>) solicitantes;
	}

	@SuppressWarnings("unchecked")
	public List<P> buscaResponsaveisAtendidos(Map<String, Object> param)
			throws Exception {

		List<UsuarioBean> responsaveis = new ArrayList<UsuarioBean>();
		UsuarioBean responsavel;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_responsaveis_atendidos");
			if (param.get("DESTINOCHAMADO") != null) {
				query += " AND CHAMADOS.DESTINO IN ('"
						+ param.get("DESTINOCHAMADO") + "')";
			}
			if (param.get("RESPONSAVEL") != null) {
				query += " AND CHAMADOS.RESPONSAVEL = ?";
			}
			ps = conn.prepareStatement(query);
			if (param.get("RESPONSAVEL") != null) {
				ps.setLong(psIndex++, (long) param.get("RESPONSAVEL"));
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				responsavel = new UsuarioBean(rs.getLong("IDUSER") + "",
						rs.getString("NOMEUSU"), null);
				responsaveis.add(responsavel);
			}
		} catch (Exception e) {
			throw e;
		}

		return (List<P>) responsaveis;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaSolicitantesSetor(UsuarioBean usuario) throws Exception {

		UsuarioBean user;
		List<UsuarioBean> usuarios = new ArrayList<UsuarioBean>();

		try {

			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_solicitantes_setor");
			if (usuario.getTipo() != null
					&& usuario.getTipo().equals("Coordenador")) {
				query += " AND FILIAL = ?";
			}
			query += " ORDER BY NOME";
			ps = conn.prepareStatement(query);
			ps.setString(1, usuario.getSetor());
			if (usuario.getTipo() != null
					&& usuario.getTipo().equals("Coordenador")) {
				ps.setString(2, usuario.getFilial().getFilial());
			}
			rs = ps.executeQuery();

			while (rs.next()) {
				user = new UsuarioBean();
				user.setCodigo(rs.getLong("IDUSER") + "");
				user.setNome(rs.getString("NOME"));
				user.setLogin(rs.getString("LOGIN"));
				user.setSetor(rs.getString("SETOR"));
				user.setFilial(new EmpresaBean(rs.getString("FILIAL"), null));
				user.setMatricula(rs.getString("MAT_FUNC"));
				user.setEmail(rs.getString("EMAIL"));
				usuarios.add(user);
			}

		} catch (Exception e) {
			throw e;
		}

		return (List<P>) usuarios;

	}

	@SuppressWarnings("unchecked")
	public List<P> buscaUsuariosCadastrados(Map<String, String> param)
			throws Exception {
		List<P> usuarios = new ArrayList<P>();
		UsuarioBean usuario = null;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("localiza_usuarios");
			if (param.get("NOME_LIKE") != null) {
				query += " AND UPPER(NOME) LIKE ?";
			}
			if (param.get("IDUSUARIO") != null) {
				query += " AND IDUSER = ?";
			}
			ps = conn.prepareStatement(query);
			if (param.get("NOME_LIKE") != null) {
				ps.setString(psIndex++, param.get("NOME_LIKE").toUpperCase()
						+ "%%");
			}
			if (param.get("IDUSUARIO") != null) {
				ps.setString(psIndex++, param.get("IDUSUARIO"));
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				usuario = new UsuarioBean();
				usuario.setCodigo(rs.getLong("IDUSER") + "");
				usuario.setNome(rs.getString("NOME"));
				usuarios.add((P) usuario);
			}
		} catch (Exception e) {
			throw e;
		}

		return usuarios;

	}
}
